package cn.fx.framework;


import cn.fx.framework.utils.*;

import cn.fx.framework.web.ApplicationHandler;
import org.springframework.context.ApplicationContext;

/**
 * 项目单例类:全局配置与缓存等快速调用类
 *    1、getApplicationHandler()：获取各应用的配置类（判断运行在开发、测试、生产环境）。
 *    2、getSpringProperty(String key)：获取属性配置。
 *    3、CLASSES_FOLDER：应用程序的Classes文件夹的物理路径，用于文件处理时作为基准路径参考
 *    4、withRedisKey(String key)：使用Redis缓存时，用于生成应用的缓存key，增加了应用的前缀。
 *    --------以下根据项目情况而定---------
 *    5、getUploadRootPath()：获取上传文件的根目录：来自属性文件中site.upload.root.path配置。
 *    6、getUploadURLPrefix()：获取上传文件的URL前缀，来自属性文件中site.upload.url.prefix配置。
 */
public final class W {
    //属性文件中配置的ApplicationHandler类，此类用于为应用程序初始化一些配置
    public static final String APPLICATION_HANDLER_CLASS_NAME = "site.application.handler";
    /**
     * 应用程序的Classes文件夹的物理路径，用于文件处理时作为基准路径参考
     */
    public static final String CLASSES_FOLDER = org.springframework.util.ClassUtils.getDefaultClassLoader().getResource(".").getPath();

    private ApplicationHandler applicationHandler;
    private String redisKeyPrefix;
    private String sitePath;
    private static String siteName;
    private final static W instance = new W();
    private W() {
    }

    /**
     * 项目启动时需要做一次初始化
     *
     * @param applicationHandler
     */
    public void initHandler(ApplicationHandler applicationHandler) {
        this.applicationHandler = applicationHandler;
        this.redisKeyPrefix = applicationHandler.getRedisKeyPrefix();
        if (!this.redisKeyPrefix.endsWith(":")) {
            //key若不是冒号结尾，则加上冒号
            this.redisKeyPrefix += ":";
        }

    }

    public static W getInstance() {
        return instance;
    }

    public static ApplicationHandler getApplicationHandler() {
        return instance.applicationHandler;
    }

    /**
     * 获取spring上下文环境
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return instance.applicationHandler.getApplicationContext();
    }

    /**
     * 获取当前应用运行的环境：dev/test/debug/pre/prod
     * @return
     */
    public static String getCurEnvironment(){
        return instance.applicationHandler.getCurEnvironment();
    }

    /**
     * 获取redis key prefix
     *
     * @param key 这个key前边加上项目指定的key前辍，若不指定，则仅返回项目指定的前辍
     * @return
     */
    public static String withRedisKey(String key) {
        if (StringUtils.isNullOrEmpty(key)) {
            return instance.redisKeyPrefix;
        }
        return String.format("%s%s", instance.redisKeyPrefix, key);
    }

    /**
     * 获取spring配置参数值
     *
     * @param key spring配置文件中配置的参数(application.properties)
     * @return
     */
    public static String getSpringProperty(String key) {
        return getApplicationContext().getEnvironment().getProperty(key);
    }

    /**
     * 获取spring配置参数值
     *
     * @param key          spring配置文件中配置的参数(application.properties)
     * @param defaultValue 没有取到时返回此值
     * @return
     */
    public static String getSpringProperty(String key, String defaultValue) {
        String value = getApplicationContext().getEnvironment().getProperty(key);
        if (StringUtils.isNullOrEmpty(value)) {
            value = defaultValue;
        }
        return value;
    }

    public void setSitePath(String sitePath) {
        this.sitePath = sitePath;
    }

    public static void setSiteName(String siteName) {
        W.siteName = siteName;
    }

    /**
     * 站点名称:XXX
     *
     * @return
     */
    public static String getSiteName() {
        return siteName;
    }

    /**
     * 获取上传文件根目录：来自属性文件中site.upload.root.path配置
     *
     * @return
     */
    public static String getUploadRootPath() {

        String rootPath = getSpringProperty("site.upload.root.path");
        if (!StringUtils.isNullOrEmpty(rootPath)) {
            return rootPath;
        } else {
            return "E:/web/market_upload";
        }
    }

    /**
     * 获取上传文件URL前缀
     *
     * @return
     */
    public static String getUploadURLPrefix() {
        String urlPrefix = getSpringProperty("site.upload.url.prefix");
        if (!StringUtils.isNullOrEmpty(urlPrefix)) {
            return urlPrefix;
        } else {
            return "/upload";
        }
    }
}
